#ifndef __SWM341_PWM_H__
#define	__SWM341_PWM_H__


typedef struct {
	uint8_t  Mode;			//PWM_EDGE_ALIGNED、PWM_CENTER_ALIGNED、PWM_ASYM_CENTER_ALIGNED

	uint16_t Clkdiv;		//1--1024

	uint16_t Period;		//周期
	
	uint16_t HdutyA;		//占空比，高电平时长；PWM_ASYM_CENTER_ALIGNED 模式下设定前半周期的高电平时长
	uint16_t HdutyA2;		//只在 PWM_ASYM_CENTER_ALIGNED 模式下使用，用于设定后半周期的高电平时长
	uint16_t DeadzoneA;		//死区时长，取值0--1023
	uint8_t  IdleLevelA;	//停止状态下PWMxA输出电平
	uint8_t  IdleLevelAN;	//停止状态下PWMxAN输出电平
	uint8_t  OutputInvA;	//PWMxA输出取反
	uint8_t  OutputInvAN;	//PWMxAN输出取反
	
	uint16_t HdutyB;
	uint16_t HdutyB2;
	uint16_t DeadzoneB;
	uint8_t  IdleLevelB;
	uint8_t  IdleLevelBN;
	uint8_t  OutputInvB;
	uint8_t  OutputInvBN;
	
	uint8_t  UpOvfIE;		//上升沿计数器溢出中断使能，PWM_EDGE_ALIGNED 模式下向上计数，因此只有上升沿
	uint8_t  DownOvfIE;		//下降沿计数器溢出中断使能，另外两种模式下先向上计数、后向下计数，上升沿是前半周期、下降沿是后半周期
	uint8_t  UpCmpAIE;		//上升沿比较器A匹配中断使能
	uint8_t  DownCmpAIE;	//下降沿比较器A匹配中断使能
	uint8_t  UpCmpBIE;		//上升沿比较器B匹配中断使能
	uint8_t  DownCmpBIE;	//下降沿比较器B匹配中断使能
} PWM_InitStructure;


#define PWM_EDGE_ALIGNED		  0
#define PWM_CENTER_ALIGNED		  1
#define PWM_ASYM_CENTER_ALIGNED   2		// 非对称中心对齐模式，上升沿和下降沿具有不同的翻转点比较值


#define PWM_CH_A	0
#define PWM_CH_B	1

#define PWM0_MSK	(1 << 0)
#define PWM1_MSK	(1 << 1)
#define PWM2_MSK	(1 << 2)
#define PWM3_MSK	(1 << 3)
#define PWM4_MSK	(1 << 4)

#define PWM_BRK0	(1 << 0)
#define PWM_BRK1	(1 << 1)
#define PWM_BRK2	(1 << 2)

#define PWM_DIR_UP		0
#define PWM_DIR_DOWN	1

#define PWM_TRG_0		0		//计数器溢出或与指定值相等时 PWM 输出触发信号
#define PWM_TRG_1		1
#define PWM_TRG_2		2
#define PWM_TRG_3		3
#define PWM_TRG_4		4
#define PWM_TRG_5		5
#define PWM_TRG_6		6
#define PWM_TRG_7		7

#define PWM_EVT_DIS		0		//外部事件信号为高时 PWM 启动计数、停止计数、暂停计数、屏蔽输出
#define PWM_EVT_0		1
#define PWM_EVT_1		2
#define PWM_EVT_2		3
#define PWM_EVT_3		4
#define PWM_EVT_4		5
#define PWM_EVT_TIMR0	6
#define PWM_EVT_TIMR1	7

/* Interrupt Type */
#define PWM_IT_OVF_UP	   (1 << 0)		//向上计数时计数器溢出，PWM_EDGE_ALIGNED 模式下向上计数，因此只有上升沿
#define PWM_IT_OVF_DOWN	   (1 << 1)		//向下计数时计数器溢出，另外两种模式下先向上计数、后向下计数，上升沿是前半周期、下降沿是后半周期
#define PWM_IT_CMPA_UP	   (1 << 2)		//向上计数时计数器值与CMPA相等
#define PWM_IT_CMPB_UP	   (1 << 3)		//向上计数时计数器值与CMPB相等
#define PWM_IT_CMPA_DOWN   (1 << 4)		//向下计数时计数器值与CMPA相等
#define PWM_IT_CMPB_DOWN   (1 << 5)		//向下计数时计数器值与CMPB相等

#define PWM_BRKIT_BRK0	   (1 << 0)		//PWM_BRK0引脚上出现刹车信号
#define PWM_BRKIT_BRK1	   (1 << 1)
#define PWM_BRKIT_BRK2	   (1 << 2)



void PWM_Init(PWM_TypeDef * PWMx, PWM_InitStructure * initStruct);			//PWM初始化
void PWM_Start(uint32_t pwm);												//启动PWM，开始PWM输出
void PWM_Stop(uint32_t pwm);												//关闭PWM，停止PWM输出
void PWM_Restart(uint32_t pwm);

void PWM_ReloadEn(uint32_t pwm);
void PWM_ReloadDis(uint32_t pwm);

void PWM_BrkInPolarity(uint32_t brk, uint32_t level);
void PWM_BrkConfig(PWM_TypeDef * PWMx, uint32_t chn, uint32_t brk, uint32_t out, uint32_t outN, uint32_t outHold, uint32_t stpCount);

void PWM_OvfTrigger(PWM_TypeDef * PWMx, uint32_t en_up, uint32_t en_down, uint32_t trig_chn);
void PWM_CmpTrigger(PWM_TypeDef * PWMx, uint16_t match, uint32_t dir, uint32_t width, uint32_t trig_chn, uint32_t adc_trig_pos);

void PWM_OutMask(PWM_TypeDef * PWMx, uint32_t chn, uint32_t evt, uint32_t out, uint32_t evt_n, uint32_t out_n);

void PWM_SetPeriod(PWM_TypeDef * PWMx, uint16_t period);					//设置周期
uint16_t PWM_GetPeriod(PWM_TypeDef * PWMx);	   								//获取周期
void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty);		//设置高电平时长
uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn);					//获取高电平时长
void PWM_SetHDuty2(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty, uint16_t hduty2);		//设置高电平时长，用于非对称中心对齐模式
void PWM_GetHDuty2(PWM_TypeDef * PWMx, uint32_t chn, uint16_t *hduty, uint16_t *hduty2);	//获取高电平时长，用于非对称中心对齐模式
void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint16_t deadzone);	//设置死区时长
uint16_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn);		 			//获取死区时长

void PWM_IntEn(PWM_TypeDef * PWMx, uint32_t it);   							//中断使能
void PWM_IntDis(PWM_TypeDef * PWMx, uint32_t it);  							//中断禁能
void PWM_IntClr(PWM_TypeDef * PWMx, uint32_t it);  							//中断标志清除
uint32_t PWM_IntStat(PWM_TypeDef * PWMx, uint32_t it); 						//中断标志查询
void PWM_BrkIntEn(uint32_t brkit);   										//刹车中断使能
void PWM_BrkIntDis(uint32_t brkit);  										//刹车中断禁能
void PWM_BrkIntClr(uint32_t brkit);  										//刹车中断标志清除
uint32_t PWM_BrkIntStat(uint32_t brkit); 									//刹车中断标志查询


#endif //__SWM341_PWM_H__
